package othello.server.service;

import java.util.List;
import java.util.logging.Logger;

import othello.client.service.OthelloService;
import othello.server.memcacheutil.GameStateCacher;
import othello.server.memcacheutil.LoungeStateCacher;
import othello.shared.model.GameStep;
import othello.shared.model.StateAtLounge;

public class OthelloServiceImpl implements OthelloService {

	private static final Logger LOGGER = Logger
			.getLogger(OthelloServiceImpl.class.getName());

	/**
	 * 指定されたステップより後のステップを返す。
	 * 
	 * @param gameBoardId
	 *            ゲームボード識別ID
	 * @param startStep
	 *            調査開始ステップ数
	 * @return 指定されたステップからのすべてのステップ。List<GameStep>
	 */
	@Override
	public List<GameStep> getStepsFrom(String gameBoardId, int startStep) {
		Object[] inputs = { gameBoardId, new Integer(startStep) };
		LOGGER.entering(this.getClass().getName(), "getStepsFrom", inputs);
		List<GameStep> steps = GameStateCacher.getInstanceFor(gameBoardId)
				.getStepsFrom(startStep);
		LOGGER.exiting(this.getClass().getName(), "getStepsFrom", steps);
		return steps;
	}

	/**
	 * 指定ゲームボートの次のステップを登録する。
	 * 
	 * @param gameBoardId
	 *            ゲームボード識別ID
	 */
	@Override
	public void entryNextStep(String gameBoardId, GameStep nextStep) {
		Object[] inputs = { gameBoardId, nextStep };
		LOGGER.entering(this.getClass().getName(), "entryNextStep", inputs);
		GameStateCacher.getInstanceFor(gameBoardId).entryStep(nextStep);
		LOGGER.exiting(this.getClass().getName(), "entryNextStep");
	}

	/**
	 * セッションに紐づくゲーム盤のIDを取得します。
	 * 
	 * @param sessionId
	 *            セッションID
	 * @return セッションに紐づくラウンジ状態。未登録の場合、null
	 */
	public StateAtLounge getGameBoard(String sessionId) {
		return LoungeStateCacher.get(sessionId);
	}

	/**
	 * <p>
	 * ゲーム状態のリセット処理を行う。
	 * </p>
	 * 
	 * @param sessionId
	 * @return
	 */
	public boolean reset(String gameBoardId) {
		LOGGER.entering(this.getClass().getName(), "reset", gameBoardId);

		// ゲーム盤状態の永続化を解除
		boolean ret = GameStateCacher.getInstanceFor(gameBoardId).delete();

		LOGGER.exiting(this.getClass().getName(), "reset", ret);
		return ret;
	}
}
